/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufg.inf.si.poo.formula1.Simulator;

import br.ufg.inf.si.poo.formula1.Driver.Driver;
import br.ufg.inf.si.poo.formula1.Race.Race;
import br.ufg.inf.si.poo.formula1.Season.Season;

/**
 * SimulatorRace
 * 
 * Versao 1.0
 * 
 * Data 30/01/2013
 * 
 * @author Igor
 */
public class SimulatorRace {
    //Construtores
    private SimulatorRace(){}

    //Outros Metodos
    /**
     * Seleciona os pilotos, cadastrados nas equipe, para participarem da corrida
     * passada como parametro, a validacao de no max 2 pilotos por equipe esta sendo
     * feita dentro do Race.setDrivers()
     * @param season, temporada para pegarmos todas equipes
     * @param race, corrida para adicionar os pilotos
     */
    public static void selectsDriversToRace(Season season, Race race){
        for(int i = 0;i < season.getQttTeams();i++){
            for(int j = 0;j < 4;j++){
                Driver driver = season.getTeams()[i].getDriver()[j];
                if(driver != null){
                    try{
                        driver.setGrandPrixEntered(driver.getGrandPrixEntered() + 1); 
                        race.setDrivers(season.getTeams()[i].getDriver()[j]);
                    }catch(IllegalArgumentException e){
                        //Nao eh necessario validar, pois eh apenas para verificar se o piloto foi adicionado ou nao
                    }
                }
            }
        }
    }

    /**
     * Executa a qualificacao e depois a propria corrida
     * @param season temporada que a corrida pertence
     * @param race corrida a ser executada
     */
    public static void executeRace(Season season, Race race){
        /* Coloco os pilotos na corrida */
        selectsDriversToRace(season, race);

        if(race.getQttDrivers() >= 18){
            /* Crio uma qualificacao para a corrida */
            race.setQualification();
            /* Executo a qualificacao da corrida */
            SimulatorQualification.exercuteQualification(race.getQualification());

            /* Crio um grid de largada baseado na qualificacao */
            race.setGridRace(race.getQualification());
            /* Executo a corrida em si, gerando tempos para cada carro em cada volta */
            SimulatorGridRace.generateTimes(race);
        }else{
            race.setStatus(1); //Este status quer dizer que a corrida nao aconteceu por falta de pilotos
        }
    }
}
